package com.zp.service;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.zp.api.aliyun.domain.CreateOutPaintingTaskResponse;
import com.zp.domain.entity.Picture;
import com.zp.domain.entity.User;
import com.zp.domain.request.picture.*;
import com.zp.domain.vo.PictureVO;

import java.util.List;


public interface PictureService extends IService<Picture> {

    /**
     * PictureVO 转 Picture
     *
     * @param pictureVO pictureVO
     * @return Picture
     */
    Picture getPicture(PictureVO pictureVO);

    /**
     * Picture 转 PictureVO
     *
     * @param picture picture
     * @return PictureVO
     */
    PictureVO getPictureVO(Picture picture);

    /**
     * 上传图片
     *
     * @param t             本地文件 / URL
     * @param uploadRequest 上传参数
     * @param loginUser     当前登录用户
     * @return 图片信息(脱敏)
     */
    <T> PictureVO uploadPicture(T t, PictureUploadRequest uploadRequest, User loginUser);

    /**
     * 删除图片
     *
     * @param pictureId 图片 id
     * @param loginUser 当前登录用户
     */
    void deletePicture(long pictureId, User loginUser);

    /**
     * 图片校验规则
     *
     * @param picture 图片
     */
    void validPicture(Picture picture);

    /**
     * 补充审核参数
     *
     * @param picture   图片
     * @param loginUser 当前登录用户
     */
    void fillReviewParams(Picture picture, User loginUser);

    /**
     * 封装图片的分页查询条件
     *
     * @param request 查询参数
     * @return 查询条件
     */
    QueryWrapper<Picture> getQueryWrapper(PictureQueryRequest request);

    /**
     * 获取图片的 VO(处理 UserVO)
     *
     * @param picture 图片
     * @return 图片的 VO
     */
    PictureVO getPictureVOWithUserVO(Picture picture);

    /**
     * 分页获取图片的 VO (处理 UserVO)
     *
     * @param picturePage 图片的分页数据
     * @return 图片的 VO
     */
    Page<PictureVO> getPictureVOPage(Page<Picture> picturePage);

    /**
     * 用户图片编辑
     *
     * @param request   图片编辑请求
     * @param loginUser 登录用户
     */
    void editPicture(PictureEditRequest request, User loginUser);

    /**
     * 管理员审核功能
     *
     * @param request   审核请求
     * @param loginUser 登录用户
     */
    void doPictureReview(PictureReviewRequest request, User loginUser);

    /**
     * 批量抓取图片
     *
     * @param batchRequest 抓取请求参数
     * @param loginUser    登录用户
     * @return 抓取数量
     */
    Integer uploadPictureByBatch(PictureUploadByBatchRequest batchRequest, User loginUser);

    /**
     * Redis + Caffeine 多级缓存
     *
     * @param queryRequest 查询参数
     * @return 分页结果
     */
    Page<PictureVO> listPictureVOByPageWithCache(PictureQueryRequest queryRequest);

    /**
     * 删除图片文件
     *
     * @param oldPicture 旧图片
     */
    void cleanPictureFile(Picture oldPicture);

    /**
     * 检查图片权限
     *
     * @param loginUser 登录用户
     * @param picture   图片
     */
    void checkPictureAuth(User loginUser, Picture picture);

    /**
     * 颜色搜索图片
     *
     * @param spaceId   空间 id
     * @param PicColor  图片主色调
     * @param loginUser 登录用户
     * @return 搜索到的图片列表
     */
    List<PictureVO> searchPictureByColor(Long spaceId, String PicColor, User loginUser);

    /**
     * 批量操作图片
     *
     * @param request   图片批量操作请求
     * @param loginUser 登录用户
     */
    void editPictureByBatch(PictureEditByBatchRequest request, User loginUser);

    /**
     * AI 扩图任务请求
     *
     * @param request   请求参数
     * @param loginUser 登录用户
     * @return 创建任务结果
     */
    CreateOutPaintingTaskResponse createOutPaintingTask(CreatePictureOutPaintingTaskRequest request, User loginUser);


}
